<?php

declare(strict_types=1);

namespace app\utils;


/**
 * 字符串工具类
 */
class StringUtils
{
    public function startsWith(string $string, string $subString): bool
    {
        return substr($string, 0, strlen($subString)) === $subString;
        // 或者 strpos($s2, $s1) === 0
    }

    public function endsWith(string $string, string $subString): bool
    {
        return substr($string, strpos($string, $subString)) === $subString;
    }

    /**
     * 下划线转驼峰（首字母大写）
     * 思路:
     * step1.原字符串转小写,原字符串中的分隔符用空格替换,在字符串开头加上分隔符
     * step2.将字符串中每个单词的首字母转换为大写,再去空格,去字符串首部附加的分隔符.
     * @param string $string 
     * @param string $separator
     * @return string 
     */
    public function camelizeFirstOn(string $string, $separator = '_')
    {
        $uncamelized_words = str_replace($separator, " ", strtolower($string));
        return str_replace(" ", "", ucwords($uncamelized_words));
    }

    /**
     * 下划线转驼峰（首字母小写）
     * 思路:
     * step1.原字符串转小写,原字符串中的分隔符用空格替换,在字符串开头加上分隔符
     * step2.将字符串中每个单词的首字母转换为大写,再去空格,去字符串首部附加的分隔符.
     * @param string $string 
     * @param string $separator
     * @return string 
     */
    public function camelize(string $string, $separator = '_')
    {
        $uncamelized_words = $separator . str_replace($separator, " ", strtolower($string));

        return ltrim(str_replace(" ", "", ucwords($uncamelized_words)), $separator);
    }

    /**
     * 驼峰命名转下划线命名
     * 思路:
     * 小写和大写紧挨一起的地方,加上分隔符,然后全部转小写
     */
    public function uncamelize($camelCaps, $separator = '_')
    {
        return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps));
    }

    /**
     * 生成随机字符串
     */
    public function generateStochastic($length = 16)
    {
        $permitted_chars = '0123456789abcdefghijklmnopqrstuvwxyz';
        return substr(str_shuffle($permitted_chars), 0, $length);
    }
}
